import pandas as pd
import numpy as np


list = [1,2,3,4]


#行名/列名索引
#行位置/列位置索引

#1.直接1维数组
ser1 = pd.Series(data=list,index=['a','b','c','d'])
#2.通过numpy转化
np_data = np.arange(1,10,dtype=np.int16)
ser1 = pd.Series(data=np_data)
#3.通过dict转化,key值自动所为index列表了
data = {'a':1,'b':2,'c':3}
ser1 = pd.Series(data=data)

#查
#索引
#位置索引
print(ser1[1])
#名索引
# print(ser1['a'])
# print(ser1.a)

#切片
print(ser1[::-1])
#索引的中括号中传入一个值,切片/列表
print(ser1[[0,1]])


print(ser1)
print("shape",ser1.shape)
print("size",ser1.size)
#是serise的行索引,给了一个Index类型的封装,包含一个index列表
print("index",ser1.index)
#值的列表
print("values",ser1.values)
print(ser1[1])

ser4 = pd.Series([1,2,3.0,5,4,6])
ser5 = pd.Series([1,2,3,5,4])

#如果产生算数问题,就补NaN

print(ser4+ser5)

#DataFrame创建

#通过list
data = [[1,2],[3,4]]
df1 =  pd.DataFrame(data,index=['a','b'],columns=['c1','c2'])
#通过numpy
data = np.random.randint(1,10,(3,3))
df2 = pd.DataFrame(data = data)
#dict转换为DataFrame,正好是用keys作为colums列表使用的
#ORM映射
data = {'name':['alice','bob','candy'],
        'age':[12,14,17]}
df3 = pd.DataFrame(data = data)
#通过IO流获取数据

df4 = pd.DataFrame(data = pd.read_excel('data.xlsx'))
#csv tsv    json xml
print(pd.read_csv('data.csv',encoding='GBK'))
print(pd.read_csv('data.tsv',encoding='GBK',sep='\t'))

print('--------------------------------------------')
#传统的获取,先取列转为Serise,再查值
print(df4['name'][2])

df5 = pd.DataFrame(data = pd.read_csv('titanic.csv'))

#类似于二维数组的写法,只能使用的是名索引

#loc[行名索引,列名索引]
print(df4.loc[1][1])
print(df4.loc[[0,1],'name'])

print('前10行数据')
print(df5.loc[0:10,['Survived', 'Pclass']])
#如果只是取列值,行位置不能空
print(df5.loc[:,['Survived', 'Pclass']])

print(type(df5.loc[:,'Pclass']))


#位置索引iloc
print(df5.iloc[-11:-1,-3:-1])

#bool索引

ser6 = pd.Series([1,2,3,4,4,5])

print(ser6[[True,False,True,True,False,False]])

print(df3[[True,False,True]])

#属性
print(df5.shape)
print(df5.size)
print(df5.index)
print(df5.columns)
print(df5.axes)
print(df5.dtypes)
print(df5.values)#返回一个纯值二维数组


print(df5.set_index('Name'))

#算数操作
mini_df = pd.DataFrame(np.random.randint(1,10,(2,2)))

print(mini_df)

print(mini_df < 1)

print(mini_df)

df6 = pd.DataFrame(data = {'name':['alice','bob','candy'],
                                'age':[19,23,17]})
ser7 = df6['age']

print()
#数据筛选
print(df6.loc[ser7 > 18])

#添加数据/修改数据/删除数据

#列的操作是直接操作于原来数据中的
#列的增,
df6['sex'] = ['男','男','女']
#列的改
df6['sex'] = ['女','男','女']
#列的删除
df6.pop('sex')


#行的操作列的操作是并不操作于原来数据中的,而是返回一个新的df
#行的增

df7 = pd.DataFrame(data = {'name':['Dvide'],
                                'age':[19]})

#一行追加
ser7 = pd.Series(['Eric',20],index=['name','age'])
print(df7)
#追加一个Serise的时候,index要制定,还要加ignore_index=True
print(df6.append(ser7,ignore_index=True))

print('------------------')
print(df6.drop(0))

#对于索引位的对应值的更改也是直接操作原来值的


#修改一整列
df6.loc[:,'sex'] = [18,18,18]
# 修改一整行
df6.loc[4] = ['aaa',28,18]

#支持行和列的追加
df6.iloc[-1,-1] = 18

df6.columns = ['姓名','年龄','性别']

#修改指定列名和行名
df6.rename(columns={'姓名':'name'},index={1:"aaa"},inplace=True)

print(df6)

#行的查
#1. loc/iloc
#2.函数 正着数/倒着数n个不是索引,是数量
print(df5.head(1))
print(df5.tail(1))

#统计函数
ser8 = pd.Series(data=[1,2,3,None,7])

print(ser8.median())#中位数
print(ser8.mean())#平均值
print(ser8.min())
print(ser8.count())#非空数值
print(ser8.std(),ser8.sum())
print(ser8.describe())#所有信息

#dataFrame的统计是对每一个列的所有值分别操作
print(df5.count())#每一列的数据操作
print(df5.min())

print(df5.median())#数学计算只能操作数值型的列
print(df5.mean())

print(df5.info())#所有的列信息











